# 常用模块
# 序列化
# python推荐使用pickle格式
# 跨平台语言使用json（不兼容集合等python特有格式）

# json 序列化模块
import json
import ujson  # 效率更高


# 猴子补丁
def monkey_patch_json():
    json.__name__ = ujson.__name__
    json.dumps = ujson.dumps
    json.loads = ujson.loads
    json.dump = ujson.dump
    json.load = ujson.load


monkey_patch_json()  # 在入口处运行，替换后面的json
# 序列化 dumps
res = json.dumps([1, 'abc', True, False])
print(res, type(res))
# 反序列化 loads
res = json.loads('[1, "abc", true, false]')
print(res, type(res))
# 序列化文件 dump
with open("test.json", mode='wt', encoding='utf-8') as f:
    json.dump([1, 'abc', True, False], f)
# 反序列化文件 load
with open("test.json", mode='rt', encoding='utf-8') as f:
    json_res = json.load(f)
    print(json_res, type(json_res))

# pickle python序列化模块
import pickle

# 序列化
res = pickle.dumps({1, 2, 3, 4, 5})
print(res, type(res))
# 返回序列化
s = pickle.loads(res)
print(s, type(s))

# configparser 模块
import configparser

# 初始化
config = configparser.ConfigParser()
config.read('test.ini')
# 获取sections
print(config.sections())
# 获取section下的options
print(config.options('section1'))
# 获取所有items
print(config.items('section1'))
# 获取单个optiond的值
print(config.get('section1','user'))
print(config.getint('section1','k1'))
print(config.getboolean('section1','is_boy'))

# hash 模块 通过hash算法得到hash值
import hashlib
import subprocess

m = hashlib.md5()
m.update('hello'.encode('utf-8'))
m.update('world'.encode('utf-8'))
res = m.hexdigest()  # hello world
print(res)

# subprocess模块 执行系统命令
import subprocess

obj = subprocess.Popen('ls /root', shell=True,
                       stdout=subprocess.PIPE,  # 管道
                       stderr=subprocess.PIPE,
                       )
res = obj.stderr.read()
# print(res.decode('GBK'))